package controller;

import java.util.ArrayList;

import sensors.ISensor;
import src.ICommunicator;
import algos.IAlgo;
import data.DriverModel;

/**
 * Controller centrale, cervello del device.
 * 
 * @author a.gallo
 *
 */

// TODO Fixare Thread.sleep();
// TODO Introdurre concetto di GEOMODEL e SLEEPINESSMODEL

public class Controller {

	private DriverModel driverModel;
	private ArrayList<ISensor> sensori;
	private IAlgo algoritmo;
	private ICommunicator communicator;

	/**
	 * Costruttore unico
	 * 
	 * @param communicator
	 *            Gestore dell'output del device.
	 * @param algoritmo
	 *            Algoritmo impiegato per ottenere il risultato finale
	 *            true/false
	 * @param sensori
	 *            ArrayList di ISensor implementati
	 */
	public Controller(ICommunicator communicator, IAlgo algoritmo,
			ArrayList<ISensor> sensori) {
		this.communicator = communicator;
		this.algoritmo = algoritmo;
		this.sensori = sensori;

	}

	/**
	 * Metodo per avviare il controller, con un metodo infinito di analisi
	 * 
	 * @throws InterruptedException
	 *             Inserito esclusivamente per il thread.sleep.
	 */
	public void run() throws InterruptedException {

		driverModel = new DriverModel();

		driverModel.run(sensori);

		while (true) {
			if (algoritmo.fuseData(sensori)) {
				communicator.beep();

			} else {
				communicator.unbeep();
			}
			Thread.sleep(100);

		}

	}

}
